
define([
    'Util',
    'text!tpl/requirement/addSubTask.tpl',
    'text!tpl/requirement/taskAss.tpl',
    'select',
    'comboSelect',
    'date',
    'form',
    'dialog',
    'jquery',
    'validator',
    'loading',
    '../common/getPath',
    'inputTag',
    'list',
    '../common/dateDiff',
    'cookie',
    'upload',
    '../requirement/fileList',
    '../common/dateFormat'
    ],
    function (Util, tpl, taskAss, Select, ComboSelect, MyDate, Form, Dialog, $, Validator, Loading, AjaxPath, inputTag, List, dateDiff, $cookie, Upload, fileList) {
    require(['style!css/style.css']);

    //系统变量-定义该模块的根节点
    var $el = null;
    var _indexModule = null,
        // list = null,
        // valiform = null,
        tabParent = null,
        addSubTaskData = null,
        loadingConfig=null,
        addSubTaskValidator = null,
        addSubTaskPrioritySelect = null,
        addSubTaskStatusSelect = null,
        addSubTaskExcuterSelect = null,
        addSubTaskLinkSelect = null,
        addSubTaskTagSelect = null,
        addSubTaskAssSelect = null,
        addSubTaskStartDate = null,
        addSubTaskEndDate = null,
        addSubTaskAnnexTable = null,
        addSubTaskTable = null,
        addSubTaskLogTable = null,
        delFlag = false,
        reqAttachmentIdList = [],
        dialog = null,
        handLoading = null;;
    //系统变量-构造函数
    var initialize = function(indexModule, options, tabItem) {
        reqAttachmentIdList = [];
        $el = $(tpl);
        _indexModule = indexModule;

        createLoading();
        addSubTaskData = options;
        console.log(addSubTaskData);
        //addSubTaskData = {"id":190,"ids":null,"requireTitle":"任务修改测试","requireType":"require","tryPeople":"1","sprintId":null,"healthStatus":null,"priStatus":"3","importStatus":null,"status":0,"parentId":4,"requireNum":null,"completionTime":null,"sprint":null,"sprintName":null,"parentRequirePojo":null,"likeEndTime":null,"likeMoreTime":null,"reallyUseTime":null,"issueId":null,"serialNumber":null,"updateTime":1505898326000,"splitStatus":null,"moduleIdList":null,"linkNumbers":null,"creater":null,"createTime":1505869447000,"describe":null,"starTime":null,"changeStatus":null,"presentDepartment":null,"presentPeople":null,"extend":null,"proposeTime":null,"activityIdList":null,"tagIdList":null,"projectId":null,"systemId":332,"systemName":null,"isdel":null,"type":3,"userName":null,"updater":null,"attachmentIdList":null,"statusName":"未开始","priStatusName":"高","tryPeopleName":"王健飞"};

        tabParent = tabItem;
        eventInit();
        this.content = $el;
        sprintInput();
        getAddTaskPosition();
        inSelect();
        initDate();
        fileUp();
        addSubTaskValidation();
    };

    //业务代码-事件初始化
    var eventInit = function() {
        $el.on('click', '.btnSave', saveAddTaskValidation);
        $el.on('click', '.btnBack', back);
    };

    var sprintInput = function () {
        //父工作项迭代
        $('.sprintName',$el).html(addSubTaskData.sprintName);
        $("input[name='sprintId']", $el).val(addSubTaskData.sprint);
    }

    var back = function() {
        tabParent.switchTab(addSubTaskData.menuId);
        tabParent.destroy("addSubTaskTab");
    }

    var switchTab = function(index) {
        $(".t-tabs-items li", $el).eq(index).trigger('click');
    }

    var inSelect = function() {
        Util.ajax.getJson( AjaxPath.project + "/dropdown?modual=require&type=priStatus", {}, function(result, isok){
            addSubTaskPrioritySelect = new Select({
                el:$("#addSubTaskPriority", $el),       //要绑定的容器
                ajax:{    //所有jquery.ajax的配置项均可配置，这些配置将替换底层组件的配置，<span class="s">慎用</span>
                    method:'GET'
                },
                label:'<i style="color:red;padding:2px;">*</i>优先级:', //下拉框单元左侧label文本，可不配置
                selectText:false,       //是否显示  ‘选择|清除’  模式
                name:'priStatus',    //下拉框单元右侧下拉框名称
                disabled:false,     //组件是否被禁用
                topOption:"请选择", //设置最顶部option的text属性
                value:'',//初始选中项设置 默认是按value，如果你想按id设置 也可以 value:[&quot;id&quot;,1],这样设置
                textField:"value",   //设置下拉框内容，填写数据中对应的字段名
                valueField:"key",//设置下拉框value，填写数据中对应的字段名
                datas: result.beans,         //数据源
                loadAtClick:false,// true--第一次点击时渲染|false或不配置--初始化时渲染
                dataReady:function(){
                    console.log("获取优先级");
                } //select的DOM结构加载完后执行
                //  url:'../data/select.json'  //数据源，不建议使用，后期将会移除
            });
            $("#addSubTaskPriority .sn-select-container").addClass("mt-5");
            addSubTaskPrioritySelect.setValue(0);
        })

        Util.ajax.getJson( AjaxPath.project + "/dropdown?modual=require&type=requireStatus&flowSwitch=true&systemId=" + addSubTaskData.systemId, {}, function(result, isok){
            addSubTaskStatusSelect = new Select({
                el:$("#addSubTaskStatus", $el),       //要绑定的容器
                ajax:{    //所有jquery.ajax的配置项均可配置，这些配置将替换底层组件的配置，<span class="s">慎用</span>
                    method:'GET'
                },
                label:'<i style="color:red;padding:2px;">*</i>状态:', //下拉框单元左侧label文本，可不配置
                selectText:false,       //是否显示  ‘选择|清除’  模式
                name:'status',    //下拉框单元右侧下拉框名称
                disabled:false,     //组件是否被禁用
                topOption:"请选择", //设置最顶部option的text属性
                value:'',//初始选中项设置 默认是按value，如果你想按id设置 也可以 value:[&quot;id&quot;,1],这样设置
                textField:"value",   //设置下拉框内容，填写数据中对应的字段名
                valueField:"key",//设置下拉框value，填写数据中对应的字段名
                datas: result.beans,         //数据源
                loadAtClick:false,// true--第一次点击时渲染|false或不配置--初始化时渲染
                dataReady:function(){
                    console.log("获取状态");
                } //select的DOM结构加载完后执行
                //  url:'../data/select.json'  //数据源，不建议使用，后期将会移除
            });
            $("#addSubTaskStatus .sn-select-container").addClass("mt-5");
            addSubTaskStatusSelect.setValue(0);
        })

        Util.ajax.getJson( AjaxPath.project + '/dropdown?modual=project&type=userId&systemId='+ addSubTaskData.systemId, {}, function(result, isok){
            tryPeopleData = result.beans;
            if(result.returnCode === "0000"){
                result.returnCode = "0";
                for(var i =0;i<result.beans.length;i++){
                    result.beans[i].name =  result.beans[i].value;
                    result.beans[i].value = result.beans[i].key;
                }
                result.beans.unshift({
                    "id":"0",
                    "name":"请选择",
                    "value":""
                })
                result.beans = JSON.parse(JSON.stringify(result.beans));
            }
            addSubTaskExcuterSelect = new ComboSelect({
                el:$("#addSubTaskExcuter", $el),       //要绑定的容器
                ajax:{    //所有jquery.ajax的配置项均可配置，这些配置将替换底层组件的配置，<span class="s">慎用</span>
                    method:'GET'
                },
                // label:'<i style="color:red;padding:2px;">*</i>经办人:', //下拉框单元左侧label文本，可不配置
                checked:'0',      
                selectText:false,       //是否显示  ‘选择|清除’  模式
                name:'tryPeople',    //下拉框单元右侧下拉框名称
                disabled:false,     //组件是否被禁用
                // topOption:"请选择", //设置最顶部option的text属性
                value:"",//初始选中项设置 默认是按value，如果你想按id设置 也可以 value:[&quot;id&quot;,1],这样设置
                // textField:"value",   //设置下拉框内容，填写数据中对应的字段名
                // valueField:"key",//设置下拉框value，填写数据中对应的字段名
                datas: result.beans,         //数据源
                loadAtClick:false,// true--第一次点击时渲染|false或不配置--初始化时渲染
                dataReady:function(){
                    console.log("获取负责人");
                } //select的DOM结构加载完后执行
                //  url:'../data/select.json'  //数据源，不建议使用，后期将会移除
            });
            $("#addSubTaskExcuter .sn-select-container").addClass("mt-5");
            // addSubTaskExcuterSelect.setValue(0);
            addSubTaskExcuterSelect.setValue( $cookie.get("userId") );
            $("#addSubTaskStatus .combo-select select option").removeAttr("selected");
            $("#addSubTaskStatus .combo-select select option:first").attr("selected","selected").attr("disabled","");
            $("#addSubTaskStatus input[name='comboInput']").attr("placeholder", "请选择");
        })

        Util.ajax.getJson( AjaxPath.project + '/dropdown?modual=require&type=linkInfo&systemId='+ addSubTaskData.systemId, {}, function(result, isok){
            addSubTaskLinkSelect = new inputTag({
                el:$('#addSubTaskLink', $el),        //必填 要绑定的容器
                name:'',
                datas: result.beans, //必填 数据源
                textField: 'value',        //设置下拉框内容，填写数据中对应的字段名
                valueField: 'key',
                placeholder:'请输入要链接的工作项',
                addTag: false,             //必填  是否可以添加新标签
            });
        })

        Util.ajax.getJson( AjaxPath.project + "/dropdown?modual=require&type=tag", {}, function(result, isok){
            addSubTaskTagSelect = new inputTag({
                el:$('#addSubTaskTag', $el),       //必填 要绑定的容器
                name:'',
                datas: result.beans,           //必填 数据源
                textField: 'value',        //设置下拉框内容，填写数据中对应的字段名
                valueField: 'key',
                placeholder:'请输入标签',
                addTag: true,             //必填  是否可以添加新标签
                maxlength:'20',
            });
        })
    }

    var initDate = function() {
        addSubTaskStartDate = new MyDate({
            el: $("#addSubTaskStartTime", $el),
            inputClassName: 'date',
            label: '<i style="color:red;padding:2px;">*</i>计划开始时间:',
            name: 'starTime',    //开始日期文本框name
            isReadOnly: true,  //项可设置日期输入框是否只读
            min: -30,         //最小日期限制
            range: false,
            type: "date",
            isDisabled: false,//是否禁用组件
            defaultValue: nowTime(0,'yyyy-MM-dd'),
            inputPlaceholder:"请选择",
            btns: ['now', 'confirm'], //'clear',
            done: function(dates,value){
                addSubTaskEndDate.options.min = dates; //设置结束日期的最小限制
                likeEndTime(dates, $("input[name=completionTime]", $el).val());
                likeMoreTime(dates, $("input[name=completionTime]", $el).val())
            }
        });
        addSubTaskEndDate = new MyDate({
            el: $("#addSubTaskEndTime", $el),
            inputClassName: 'date',
            label: '<i style="color:red;padding:2px;">*</i>计划完成时间:',
            name: 'completionTime',    //开始日期文本框name
            isReadOnly: true,  //项可设置日期输入框是否只读
            min: 0,         //最小日期限制
            range: false,
            type: "date",
            isDisabled: false,//是否禁用组件
            inputPlaceholder:"请选择",
            // defaultValue: nowTime(365,'yyyy-MM-dd'),
            defaultValue: '',
            btns: ['now', 'confirm'], //'clear',
            done: function(dates,value){
                addSubTaskStartDate.options.max = dates; //设置开始日期的最大日期
                likeEndTime($("input[name=starTime]", $el).val(), dates);
                likeMoreTime($("input[name=starTime]", $el).val(), dates);
            }
        });
    }

    //计算预估工时
    var likeEndTime = function(startDate, endDate){
        if(startDate!=="" && endDate !==""){
            var date = dateDiff(startDate, endDate);
            $("input[name=likeMoreTime]", $el).val(date * 8);
        }

    }

    //计算预估剩余工时
    var likeMoreTime = function(startDate, endDate){
        if(startDate!=="" && endDate !==""){
            var startDateTime = "";
            var startDateTamp = startDate.replace(/-/g, "");
            var todayDateTamp = new Date().Format('yyyy-MM-dd').replace(/-/g, "");

            if(parseInt(startDateTamp) > parseInt(todayDateTamp)){
                startDateTime = startDate;
            }else{
                startDateTime = new Date().Format('yyyy-MM-dd');
            }

            var date = dateDiff(startDateTime, endDate);
            $("input[name=likeEndTime]", $el).val(date * 8);
        }
    }

    //附件
    var fileUp = function () {
        var uploadConfig = {
            el: $("#addSubTaskUpload", $el), //组件绑定的容器
            className: 'upload', //组件外围的className
            url:  AjaxPath.project + '/uploadFile/upload', //组件上传的后台接口
            // deleteUrl: 'data/upload.json?name=[name]', //组件上传的后台接口
            paramName:'textFile',
        };
        var filesUpload = new Upload(uploadConfig);


        filesUpload.on('submit',function(e,data){
            //formData的数据会和二进制数据一起提交到服务端
            data.formData = { creator:$cookie.get("userId"), businessType:'require', type:2 };
        });

        filesUpload.on('done',function(e,data){
            reqAttachmentIdList.push(data.result.files[0].attId);
        });
        filesUpload.on('remove',function(e,data){
            if(data.attId){
                delFlag=true;
                data=data.attId;
            };
            uploadDelete(e,data)
            //e新增自定义remove方法，可根据服务端文件处理结果删除文件列表中的当前行
        })

        filesUpload.on('download',function(e,data){
            console.log(data)
            if(data.attId){
                delFlag=true;
                data=data.attId;
                uploadDown(e,data);
            };
        })
    };

    function uploadDelete(e,data){
        //e新增自定义remove方法，可根据服务端文件处理结果删除文件列表中的当前行
        if(delFlag){
            new Dialog({
                title: '提示', //弹窗标题，
                content: '<div style="text-align:center;margin-top:50px">确定要删除该附件吗？</div>', //弹窗内容，可以是字符串、html代码段,tpl对象。默认为loading状态（由点组成的圈。大段代码建议使用 tpl。
                okValue: '确&nbsp;&nbsp;定', //确定按钮的文本 默认是 ‘ok’
                ok: function() {
                    Util.ajax.getJson(AjaxPath.project+'/attachment/delete/'+data, {}, function(result, isok){
                        if(result.returnCode==='0000'){
                            reqAttachmentIdList = $.grep(reqAttachmentIdList,function(i,n){
                                return i!= data;
                            },false);
                            console.log(reqAttachmentIdList);
                            e.remove();
                            new Dialog({
                                mode: 'tips',
                                delayRmove:3, //延迟删除秒数设定 tips默认3秒,非tips默认不关闭。
                                tipsType:'tips', //tips类型；可选 success | error，默认普通tips。
                                maxWidth:'226px', //设置tips对话框的最大宽度,默认为226px。仅在tips对话框下生效，该项存在时，width属性将失效。
                                content: '删除附件成功！'
                            });
                        }else{
                            new Dialog({
                                mode: 'tips',
                                delayRmove:3, //延迟删除秒数设定 tips默认3秒,非tips默认不关闭。
                                tipsType:'tips', //tips类型；可选 success | error，默认普通tips。
                                maxWidth:'226px', //设置tips对话框的最大宽度,默认为226px。仅在tips对话框下生效，该项存在时，width属性将失效。
                                content: '删除附件失败！'
                            });
                        }
                        return true;
                    });
                },
                cancel: function() {},
                cancelValue: '取&nbsp;&nbsp;消', //取消按钮的文本 默认是 ‘关闭’
                width: 300,
                height: 120,
                modal:true,
            });
        }else{
            e.remove();
        }
    };

    function uploadDown(e,data){
        //e新增自定义remove方法，可根据服务端文件处理结果删除文件列表中的当前行
        if(delFlag){
            window.location.href='/uploadFile/download?id=data.attId';
        }
    }

    var addSubTaskValidation = function(checked) {
        var config = {
            // el: $('.validatorForm'),
            el: $(".detailAddSubTaskForm", $el),
            submitBtn: $(".btnSave"), //触发验证的按钮，可不配置
            dialog: true, //是否弹出验证结果对话框
            pattern: { numberThree: "^(\\d+\\.\\d{1,1}|\\d+)$" },
            rules: {
                requireTitle: "required",
                priStatus: "required",
                status: 'required',
                starTime: 'required|date',
                completionTime: "required|date",
                likeEndTime: "required|number|numberThree",
                likeMoreTime: "required|numberThree",
                reallyUseTime: "numberThree",
                tryPeople: "required"
            },
            messages: {
                requireTitle: {
                    required: "子工作项名称不能为空！"
                },
                priStatus: {
                    required: "优先级不能为空！"
                },
                status: {
                    required: "状态不能为空！"
                },
                starTime: {
                    required: "计划开始时间不能为空！"
                },
                completionTime: {
                    required: "计划完成时间不能为空！"
                },
                likeMoreTime: {
                    required: "预估工时不能为空！",
                    numberThree: "此项必须为数字(非负数，可保留一位小数)！"
                },
                likeEndTime: {
                    required: "预估剩余工时不能为空！",
                    numberThree: "此项必须为数字(非负数，可保留一位小数)！"
                },
                reallyUseTime: {
                    numberThree: "此项必须为数字(非负数，可保留一位小数)！"
                },
                tryPeople: {
                    required: "经办人不能为空！"
                }
            }
        };
        addSubTaskValidator = new Validator(config);
    }

    var saveAddTaskValidation = function() {
        if(addSubTaskValidator.form()) {
            saveAddTask();
        } else {
            console.log('验证失败');
        }
    }

    var saveAddTask = function(e) {
        handLoading = new Loading(loadingConfig);
        if(true) {
            var config = null,
                dialog = null;

            var tagData = {};
                tagData.tags = addSubTaskTagSelect.getCheckSelectTag();
                tagData.createPerson = $cookie.get("userId");
                // tagData.createPerson = 1;
                tagData.createModule = 'require';

            Util.ajax.postJson(AjaxPath.project + "/tag", JSON.stringify(tagData), function(tagResult, isok) {
                if(tagResult.returnCode==="0000"){
                    var tagList = [];
                    $(tagResult.beans).each(function(index, item){
                        tagList.push(item.id ? item.id : item.key );
                    })
                    var data = Form.serialize($('.detailAddSubTaskForm', $el));
                        data.parentId = addSubTaskData.id;
                        data.systemId = addSubTaskData.systemId;
                        data.creater = $cookie.get("userId");
                        // data.creater = 1;
                        data.linkIdAndTypes = addSubTaskLinkSelect.getCheckSelectTag("key");
                        data.tagIdList = tagList;
                        data.attachmentIdList = reqAttachmentIdList;

                    Util.ajax.postJson(AjaxPath.demand + '/requires/'+ addSubTaskData.id +'/task', JSON.stringify(data), function(taskResult, isok) {
                        if(taskResult.returnCode==="0000") {
                            var editTagData = {};
                                editTagData.tags = tagResult.beans;
                                editTagData.createModuleId = taskResult.beans.id;

                            Util.ajax.postJson(AjaxPath.project + "/tag/bathUpdate", JSON.stringify(editTagData), function(result, isok) {
                                handLoading.destroy();
                                if(result.returnCode==="0000"){
                                    config = {
                                        mode: 'confirm', // 对话框模式，默认normal标准|confirm浮动层|confirm确认对话框
                                        title:'提示',
                                        width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                                        height: 120, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                                        cancelDisplay: false, //是否显示取消按钮（强制执行，可在confirm模式下生效），可选项。 默认true(显示)
                                        modal:true,
                                        content: '<div style="text-align:center;margin-top:50px">新建子工作项成功</div>' ,// 对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                                    };
                                    dialog = new Dialog(config);
                                    dialog.on('onclose',function(){
                                        back();
                                    });
                                }else{
                                    config = {
                                        mode: 'confirm', // 对话框模式，默认normal标准|confirm浮动层|confirm确认对话框
                                        title:'提示',
                                        width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                                        height: 120, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                                        cancelDisplay: false, //是否显示取消按钮（强制执行，可在confirm模式下生效），可选项。 默认true(显示)
                                        modal:true,
                                        content: '<div style="text-align:center;margin-top:50px">'+result.returnMessage+'</div>' ,// 对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                                    };
                                    dialog = new Dialog(config);
                                }
                            },'application/json')

                        } else {
                            handLoading.destroy();
                            config = {
                                mode: 'confirm', // 对话框模式，默认normal标准|confirm浮动层|confirm确认对话框
                                title:'提示',
                                width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                                height: 120, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                                cancelDisplay: false, //是否显示取消按钮（强制执行，可在confirm模式下生效），可选项。 默认true(显示)
                                modal:true,
                                content: '<div style="text-align:center;margin-top:50px">'+taskResult.returnMessage+'</div>' ,// 对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                            };
                            dialog = new Dialog(config);
                        }
                    },'application/json');
                }else {
                    handLoading.destroy();
                    config = {
                        mode: 'confirm', // 对话框模式，默认normal标准|confirm浮动层|confirm确认对话框
                        title:'提示',
                        width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                        height: 120, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                        cancelDisplay: false, //是否显示取消按钮（强制执行，可在confirm模式下生效），可选项。 默认true(显示)
                        modal:true,
                        content: '<div style="text-align:center;margin-top:50px">'+tagResult.returnMessage+'</div>' ,// 对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                    };
                    dialog = new Dialog(config);
                }
            },'application/json');
        }
    }

    var getAddTaskPosition = function(){
        Util.ajax.getJson(AjaxPath.demand + '/requires/position/'+ addSubTaskData.id, {}, function(result, isok){
            if(result.returnCode==="0000"){
                var positionStr = "";
                positionStr = positionStr + addSubTaskData.systemName + ' / ';
                $(result.beans).each(function(index, item){
                    positionStr += item.requireTitle + ' / ';
                })
                positionStr = positionStr.substring(0,positionStr.length-2);
                $(".addSubTaskPosition", $el).html(positionStr);
            }else {
                config = {
                    mode: 'confirm', // 对话框模式，默认normal标准|confirm浮动层|confirm确认对话框
                    title:'提示',
                    width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                    height: 120, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                    cancelDisplay: false, //是否显示取消按钮（强制执行，可在confirm模式下生效），可选项。 默认true(显示)
                    modal:true,
                    content: '<div style="text-align:center;margin-top:50px">'+result.returnMessage+'</div>' ,// 对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                };
                dialog = new Dialog(config);
            }
        });
    }

    var createLoading = function(){
        loadingConfig = {
            el:'body',                  //组件要绑定的容器，默认为body（此项可不配置或留空）
            className:'loading',           //组件外围的className
            position:'center',      //提示信息位置，顶部top|默认center中央
            width:'300',      //loading的宽度,非必须，默认300
            height:'auto',      //loading的宽度,非必须，默认auto
            mask:1,                 //是否显示遮罩， 0不显示|默认1显示
            animate:1,              //是否显示动画效果， 0不显示|默认1显示
            mode:'layer',     //展示方式 loadingLine线条方式|默认layer弹层方式
            text:'加载中...',       //提示文字，默认 加载中...
            icon:'dotCycle',  //文字前面的gif动画， 默认dotCycle有点组成的圈|cmcc移动图标|cmccLarge大的移动图标
        }
    };

    return initialize;

});
